package com.imooc.coupon.entity;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.imooc.coupon.constant.CouponCategory;
import com.imooc.coupon.constant.DistributeTarget;
import com.imooc.coupon.constant.ProductLine;
import com.imooc.coupon.support.vo.TemplateRule;
import com.imooc.coupon.converter.CategoryConverter;
import com.imooc.coupon.converter.DistTargetConverter;
import com.imooc.coupon.converter.ProductLineConverter;
import com.imooc.coupon.converter.RuleConverter;
import com.imooc.coupon.serial.CouponTemplateSerialize;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 优惠券模板实体 （含基础属性 + 规则属性）
 * Created By TINY
 * Create Time 2020/2/9 - 16:17
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class) // 让JPA对一些属性进行管理（如时间类型属性）
@Table(name = "coupon_template")
// 使用自定义的属性序列化器
@JsonSerialize(using = CouponTemplateSerialize.class)
public class CouponTemplate implements Serializable {

    /** 自增主键 */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 主键策略为自增
    @Column(name = "id", nullable = false)
    @Basic // 默认存在，表示将改属性自动映射为数据表中的字段
//    @Transient 表示不将目标属性映射为数据表中的字段
    private Integer id;

    /** 使用可用 */
    @Column(name = "available", nullable = false)
    private Boolean available;

    /** 是否过期 */
    @Column(name = "expired", nullable = false)
    private Boolean expired;

    /** 优惠券名称 */
    @Column(name = "name", nullable = false)
    private String name;

    /** 优惠券名称 */
    @Column(name = "logo", nullable = false)
    private String logo;

    /** 优惠券描述 */
    @Column(name = "intro", nullable = false)
    private String desc;

    /** 优惠券分类 */
    @Column(name = "category", nullable = false)
    // 使用自定义优惠券类型的属性转换器
    @Convert(converter = CategoryConverter.class)
    private CouponCategory category;

    /** 产品类型 */
    @Column(name = "product_line", nullable = false)
    // 使用自定义的产品线属性转换器
    @Convert(converter = ProductLineConverter.class)
    private ProductLine productLine;

    /** 优惠券总数 */
    @Column(name = "coupon_count", nullable = false)
    private Integer count;

    /** 创建时间 */
    @CreatedDate // 由JPA维护此字段，此字段创建后便不再修改
//    @CreatedBy   // 由谁创建
//    @UpdateTimestamp // 字段更新时间
    @Column(name = "create_time", nullable = false)
    private Date createTime;

    /** 创建用户的id */
    @Column(name = "user_id", nullable = false)
    private Long userId;

    /** 优惠券模板的编码 */
    @Column(name = "template_key", nullable = false)
    private String key;

    /** 派发的目标用户 */
    @Column(name = "target", nullable = false)
    // 使用自定义的分发目标枚举属性转换器
    @Convert(converter = DistTargetConverter.class)
    private DistributeTarget target;

    /** 优惠券规则 */
    @Column(name = "rule", nullable = false)
    // 使用自定义的优惠券规则属性转换器
    @Convert(converter = RuleConverter.class)
    private TemplateRule rule;

    public CouponTemplate(String name, String logo, String desc, String category,
                          Integer productLine, Integer count, Long userId,
                          Integer target, TemplateRule rule) {
        this.available = false;
        this.expired = false;
        this.name = name;
        this.logo = logo;
        this.desc = desc;
        this.category = CouponCategory.of(category);
        this.productLine = ProductLine.of(productLine);
        this.count = count;
        this.userId = userId;

        // 优惠券唯一编码 4位（产品 + 类型）+ 8位（日期）+ 4位（随机id）
        this.key = productLine.toString() + category +
                new SimpleDateFormat("yyyyMMdd").format(new Date());

        this.target = DistributeTarget.of(target);
        this.rule = rule;
    }
}
